<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // call  apply   bind  => 改变this的指向(所有的函数都可以使用  => 函数的拓展方法)

    // new Function()
    // function fn() { // 函数也可以理解为是一个实例化对象

    // }
    // console.dir(fn)

    // 函数也可以理解为是一个实例化对象 => 构造函数Function创建的 => 可以访问Function.prototype公有的属性和方法
    // console.log(fn.constructor === Function);
    // console.log(fn.__proto__ === Function.prototype);


    // -------------------------------------------------------------------------

    // call  apply   bind 

    // bind(thisObj,arg1,arg2,....argN)
    // 1. 根据原函数生成新函数
    // 2. 新函数执行过程中,强制将this指向bind()的第一参数,如果第一参数是null和undefined => 只是调用原函数,并不改变this指向
    // 3. 如果函数需要接收参数
    //    a. 从bind()的第二参数开始依次向后传  => 参数定死
    //    b. 新函数调用传入  => 参数灵活
    //    => bind()传入的参数 + 新函数调用时传入的参数 >= 原函数的参数和

    // 总结: 根据原函数的到新函数,新函数的this指向改变 ,原函数也没有影响 (授人以鱼不如授人以渔)



    function fn(a, b) {
        console.log("this", this);
        console.log("参数", a, b);
    }

    // var newFn = fn.bind(document.body, 1, 2);
    // console.log(newFn);
    // console.log(newFn === fn);

    // newFn(); // 新函数执行过程中,强制将this指向bind()的第一参数
    // newFn();


    // var newFn = fn.bind(document.body);
    // newFn(1, 2); // 新函数执行过程中,强制将this指向bind()的第一参数
    // newFn(3, 4);


    var newFn = fn.bind(document.body, 100);
    newFn("a"); // 新函数执行过程中,强制将this指向bind()的第一参数
    newFn("b");










</script>

</html>